package db_manager

import (
	"context"
	"database/sql"
	"fmt"
	"log"

	"github.com/linchao/zkp_auth/models"
)

// SQLiteDeviceManager 是基于SQLite的设备管理器实现
type SQLiteDeviceManager struct {
	// 使用models包中的DB连接
}

// NewSQLiteDeviceManager 创建一个新的SQLite设备管理器
func NewSQLiteDeviceManager() *SQLiteDeviceManager {
	return &SQLiteDeviceManager{}
}

// checkDBConnection 检查数据库连接是否已初始化
func (m *SQLiteDeviceManager) checkDBConnection() error {
	if models.DB == nil {
		return fmt.Errorf("数据库未初始化")
	}
	return nil
}

// ListDevices 获取所有已注册设备
func (m *SQLiteDeviceManager) ListDevices(ctx context.Context) ([]*models.Device, error) {
	if err := m.checkDBConnection(); err != nil {
		return nil, err
	}

	// 准备SQL查询，现在包含session_id字段
	query := `SELECT device_id, y1, y2, session_id FROM devices ORDER BY device_id`
	rows, err := models.DB.QueryContext(ctx, query)
	if err != nil {
		return nil, fmt.Errorf("查询设备列表失败: %v", err)
	}
	defer rows.Close()

	// 解析结果
	var devices []*models.Device
	for rows.Next() {
		device := &models.Device{}
		// 使用sql.NullString来处理可能为NULL的session_id
		var sessionID sql.NullString
		if err := rows.Scan(&device.DeviceID, &device.Y1, &device.Y2, &sessionID); err != nil {
			return nil, fmt.Errorf("解析设备数据失败: %v", err)
		}
		// 如果sessionID有效，则赋值给device.SessionID，否则使用空字符串
		if sessionID.Valid {
			device.SessionID = sessionID.String
		} else {
			device.SessionID = ""
		}
		devices = append(devices, device)
	}

	// 检查迭代过程中是否有错误
	if err := rows.Err(); err != nil {
		return nil, fmt.Errorf("迭代设备行时出错: %v", err)
	}

	return devices, nil
}

// GetDevice 根据ID获取设备
func (m *SQLiteDeviceManager) GetDevice(ctx context.Context, deviceID string) (*models.Device, error) {
	// 直接使用models包的现有实现
	return models.GetDevice(ctx, deviceID)
}

// CountDevices 获取设备总数
func (m *SQLiteDeviceManager) CountDevices(ctx context.Context) (int, error) {
	if err := m.checkDBConnection(); err != nil {
		return 0, err
	}

	var count int
	query := `SELECT COUNT(*) FROM devices`
	err := models.DB.QueryRowContext(ctx, query).Scan(&count)
	if err != nil {
		return 0, fmt.Errorf("计算设备数量失败: %v", err)
	}

	return count, nil
}

// DeleteDevice 删除设备
func (m *SQLiteDeviceManager) DeleteDevice(ctx context.Context, deviceID string) error {
	if err := m.checkDBConnection(); err != nil {
		return err
	}

	// 准备删除语句
	stmt, err := models.DB.PrepareContext(ctx, `DELETE FROM devices WHERE device_id = ?`)
	if err != nil {
		return fmt.Errorf("准备删除语句失败: %v", err)
	}
	defer stmt.Close()

	// 执行删除
	result, err := stmt.ExecContext(ctx, deviceID)
	if err != nil {
		return fmt.Errorf("执行删除失败: %v", err)
	}

	// 检查是否实际删除了行
	affected, err := result.RowsAffected()
	if err != nil {
		log.Printf("警告：无法确定影响的行数: %v", err)
	} else if affected == 0 {
		return fmt.Errorf("设备不存在: %s", deviceID)
	}

	return nil
}
